package com.mimc.controller.admin;

import cn.hutool.core.lang.Validator;
import com.jfinal.aop.Inject;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Page;
import com.mimc.common.constant.EventConstants;
import com.mimc.common.utils.StringUtils;
import com.mimc.core.model.SysLang;
import com.mimc.core.service.SysLangService;
import com.mimc.framework.domain.AjaxResult;
import com.mimc.service.ShTranslateService;
import io.jboot.Jboot;
import io.jboot.db.model.Columns;
import io.jboot.utils.StrUtil;
import io.jboot.web.controller.JbootController;
import io.jboot.web.controller.annotation.RequestMapping;
import lombok.extern.slf4j.Slf4j;
import java.util.Date;
import java.util.List;

@Slf4j
@RequestMapping("/admin/sys/lang")
public class SysLangController extends JbootController {
    @Inject
    private SysLangService sysLangService;
    @Inject
    private ShTranslateService shTranslateService;
    public AjaxResult lists(){
        Integer page=getInt("page",1);
        Integer pageSize=getInt("pageSize",15);
        String name=getPara("name");
        Columns columns=Columns.create();
        if(StringUtils.isNotBlank(name)){
            columns.eq("name",name);
        }
        Page<SysLang> list=sysLangService.paginateByColumns(page,pageSize,columns,"create_time desc");
        return AjaxResult.success("成功",list);
    }

    public AjaxResult add(){
        String name=getPara("name");
        String varName=getPara("varName");
        String backCode=getPara("backCode");
        String frontCode=getPara("frontCode");
        String remark=getPara("remark");
        Boolean isDefault=getBoolean("isDefault",false);
        if(Validator.hasChinese(varName)){
            return AjaxResult.error("字段名称不能包含中文");
        }
        if(StrUtil.isBlank(name)){
            return AjaxResult.error("语言名称不能为空");
        }
        if(StrUtil.isBlank(frontCode)){
            return AjaxResult.error("前端代码不能为空");
        }
        if(StrUtil.isBlank(backCode)){
            return AjaxResult.error("后端代码不能为空");
        }
        if(StrUtil.isBlank(remark)){
            return AjaxResult.error("请输入备注");
        }
        SysLang hasLang=sysLangService.findFirstByColumns(Columns.create("name",name));
        if(hasLang!=null){
            return AjaxResult.error("该语言已创建");
        }
        SysLang hasVarLang=sysLangService.findFirstByColumns(Columns.create("var_name",varName));
        if(hasVarLang!=null){
            return AjaxResult.error("该字段已创建");
        }
        SysLang lang=new SysLang();
        lang.setName(name);
        lang.setVarName(varName);
        lang.setBackCode(backCode);
        lang.setFrontCode(frontCode);
        lang.setRemark(remark);
        lang.setIsDefault(isDefault);
        lang.setCreateTime(new Date());
        lang.setUpdateTime(new Date());
        //设置默认
        List<SysLang> list=sysLangService.findAll();
        if(isDefault){
            for (SysLang sysLang:list){
                sysLang.setIsDefault(false);
                sysLangService.update(sysLang);
            }
        }else{
            if(list.size()==0){
                lang.setIsDefault(true);
            }
        }
        Integer id= (Integer) sysLangService.save(lang);
        if(id>0){
            //创建字段
            String sql="ALTER TABLE sys_translate ADD COLUMN "+lang.getVarName()+" VARCHAR(500) DEFAULT NULL COMMENT '"+lang.getRemark()+"'";
            Db.update(sql);
            //版本管理添加语言
            String verSql="ALTER TABLE sys_app_version ADD COLUMN "+lang.getVarName()+" VARCHAR(1000) DEFAULT NULL COMMENT '"+lang.getRemark()+"'";
            Db.update(verSql);
            Jboot.sendEvent(EventConstants.LOADTRANSLATEEVENT,"");
            return AjaxResult.success("成功",id);
        }else{
            return AjaxResult.error("创建失败");
        }
    }

    public AjaxResult setDefault(Integer langId){
        SysLang lang=sysLangService.findById(langId);
        if(lang!=null){
            List<SysLang> list=sysLangService.findAll();
            for (SysLang sysLang:list){
                sysLang.setIsDefault(false);
                sysLangService.update(sysLang);
            }
            lang.setIsDefault(true);
            sysLangService.update(lang);
            Jboot.sendEvent(EventConstants.LOADTRANSLATEEVENT,"");
            return AjaxResult.success("设置成功");
        }else{
            return AjaxResult.error("该语言不存在");
        }
    }
    public AjaxResult update(){
        Integer langId=getInt("langId");
        String name=getPara("name");
        String varName=getPara("varName");
        String backCode=getPara("backCode");
        String frontCode=getPara("frontCode");
        String remark=getPara("remark");
        Boolean isDefault=getBoolean("isDefault",false);
        if(Validator.hasChinese(varName)){
            return AjaxResult.error("字段名称不能包含中文");
        }
        if(StrUtil.isBlank(name)){
            return AjaxResult.error("语言名称不能为空");
        }
        if(StrUtil.isBlank(frontCode)){
            return AjaxResult.error("前端代码不能为空");
        }
        if(StrUtil.isBlank(backCode)){
            return AjaxResult.error("后端代码不能为空");
        }
        if(StrUtil.isBlank(remark)){
            return AjaxResult.error("请输入备注");
        }
        SysLang lang=sysLangService.findById(langId);
        if(lang==null){
            return AjaxResult.error("该语言不存在");
        }
        List<SysLang> list=sysLangService.findAll();
        if(isDefault){
            for (SysLang sysLang:list){
                sysLang.setIsDefault(false);
                sysLangService.update(sysLang);
            }
        }else{
            if(list.size()==0){
                lang.setIsDefault(true);
            }
        }
        boolean varNameChange=varName!= lang.getVarName();
        String oldVarName=lang.getVarName();
        lang.setName(name);
        lang.setVarName(varName);
        lang.setBackCode(backCode);
        lang.setFrontCode(frontCode);
        lang.setRemark(remark);
        lang.setIsDefault(isDefault);
        lang.setUpdateTime(new Date());
        sysLangService.update(lang);
        if(varNameChange){
            String sql="ALTER TABLE sys_translate CHANGE %s %s VARCHAR(500) DEFAULT NULL COMMENT '"+lang.getRemark()+"'";
            sql=String.format(sql,oldVarName,varName);
            Db.update(sql);
            //版本管理添加语言
            String verSql="ALTER TABLE sys_app_version CHANGE %s %s VARCHAR(1000) DEFAULT NULL COMMENT '"+lang.getRemark()+"'";
            verSql=String.format(verSql,oldVarName,varName);
            Db.update(verSql);
        }
        Jboot.sendEvent(EventConstants.LOADTRANSLATEEVENT,"");
        return AjaxResult.success("成功");
    }
    public AjaxResult delete(Integer langId){
        SysLang lang=sysLangService.findById(langId);
        if(lang==null){
            return AjaxResult.error("该语言不存在");
        }
        String sql="ALTER TABLE sys_translate DROP COLUMN %s;";
        sql=String.format(sql,lang.getVarName());
        Db.update(sql);
        //版本管理添加语言
        String verSql="ALTER TABLE sys_app_version DROP COLUMN %s;";
        verSql=String.format(verSql,lang.getVarName());
        Db.update(verSql);
        lang.delete();
        Jboot.sendEvent(EventConstants.LOADTRANSLATEEVENT,"");
        return AjaxResult.success("成功");
    }
    public AjaxResult getAll(){
        List<SysLang> list=sysLangService.findAll();
        return AjaxResult.success("成功",list);
    }
    public AjaxResult reloadCache(){
        //shTranslateService.loadLangCache();
        Jboot.sendEvent(EventConstants.LOADTRANSLATEEVENT,"");
        return AjaxResult.success("成功");
    }
}
